home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FishMarket 1.0
/
FishMarket v1.0.iso
/
fishies
/
626-637
/
disk_635
/
powerlogo
/
utilities
< prev
next >
Wrap
Text File
|
1992-05-06
|
14KB
|
480 lines
; Utilities
pr [ ]
pr [ This file adds menus to the LOGO user interface, ]
pr [ and defines some useful procedures and constants. ]
pr [ ]
; *** Set amount of memory reserved by LOGO.
( system 2 * 15 8192 )
; *** Scramble random number generater.
( seedrand * 100 seconds )
; *** Has this file already been loaded?
if buriedp "utility-stuff [ unbury :utility-stuff ] [ ]
; *** Numerical constants.
make "e 2.71828182845904523536
make "pi 3.14159265358979323846
; *** Output list of all variable names.
make "all [ procedure [ ] output se namelist burylist ]
; *** Output list of names that contain something other than procedures.
make "allnames [
procedure [ [ ] [ ] [ :scr-n :scr-x :scr-o ] ]
make "scr-n se burylist namelist
dowhile
[ make "scr-x first :scr-n
make "scr-n bf :scr-n
if ( or primitivep :scr-x
procedurep :scr-x
if > 4 count :scr-x
[ false ]
[ = "scr- items 1 4 :scr-x ] )
[ ]
[ make "scr-o fput :scr-x :scr-o ] ]
[ not emptyp :scr-n ]
output :scr-o ]
; *** Output list of names that contain procedures.
make "allprocs [
procedure [ [ ] [ ] [ :scr-n :scr-x :scr-o ] ]
make "scr-n se burylist namelist
dowhile
[ make "scr-x first :scr-n
make "scr-n bf :scr-n
if procedurep :scr-x
[ make "scr-o fput :scr-x :scr-o ]
[ ] ]
[ not emptyp :scr-n ]
output :scr-o ]
; *** Print out contents of directory.
make "dr [
procedure [ [ ] [ :d :p ] ]
vpr ( sdir :d :p ) ]
; *** Print out contents of directory, and all sub directories.
make "dra [
procedure [ [ ] [ :d :p ] ]
vpr ( sdira :d :p ) ]
; *** Edit the contents of specified variables.
; This procedure works by calling the "QED" text editor by Darren M.
; Greenwald. You may replace "QED" with the name of the text editor of
; your choice.
make "edit [
procedure [ [ :scr-n ] ]
prosave "ram:LOGO-workspace :scr-n
doscommand [ QED ram:LOGO-workspace ]
load "ram:LOGO-workspace ]
; *** Close all files, windows, and screens, return to toplevel.
make "end [
procedure [ ]
while [ not emptyp filelist ] [ close first filelist ]
while [ not emptyp screenlist ] [ closescreen first screenlist ]
while [ not emptyp windowlist ] [ closewindow first windowlist ]
while [ not emptyp system 6 ] [ ( system 5 first system 6 ) ]
recycle
toplevel ]
; *** Output list of all items in one list that are not in the other.
make "filter [
procedure [ [ :r :f ] [ ] [ :o ] ]
while [ not emptyp :f ]
[ if memberp first :f :r
[ ]
[ make "o fput first :f :o ]
make "f bf :f ]
output reverse :o ]
; *** Does nothing. Ignores the output of an operation.
make "ignore [ procedure [ [ :i1 ] :i2 ] ]
; *** Set up the command window menus and demons.
make "initmenu [
procedure [ ]
whenmenu [ domenu getmenu ]
setmenu @0 :com-menu ]
make "com-menu [ \ \ Utilities\ \ \
[ \ Load L ]
[ \ Save [ \ Names N ]
[ \ Procs P ]
[ \ All A ] ]
[ \ Interrupt I ]
[ \ Top\ Level T ]
[ \ End E ]
[ \ Restart R ]
[ \ Quit Q ] ]
make "domenu [
procedure [ [ :scr-menu ] [ ] [ :scr-sub ] ]
if = @0 first :scr-menu
[ if = 1 item 2 :scr-menu
[ do-com-menu :scr-menu ]
[ if and procedurep "more-menus
not = 0 item 2 :scr-menu
[ more-menus :scr-menu ]
[ ] ] ]
[ if procedurep "window-menus
[ window-menus :scr-menu ]
[ ] ] ]
make "do-com-menu [
procedure [ [ :scr-menu ] [ ] [ :scr-sub ] ]
make "scr-sub item 4 :scr-menu
make "scr-menu item 3 :scr-menu
cond
[ [ = 1 :scr-menu ]
[ pr [ ]
type "LOADING\ FILE:\ \
make "scr-menu ( filerequest "Load\ File\ \ -\ )
if emptyp :scr-menu
[ pr "LOAD\ CANCELED ]
[ pr :scr-menu
load :scr-menu
pr "LOAD\ COMPLETE ]
type "? ]
[ = 2 :scr-menu ]
[ pr [ ]
type "SAVING\ FILE:\ \
make "scr-menu ( filerequest "Save\ File\ \ -\ )
if emptyp :scr-menu
[ pr "SAVE\ CANCELED ]
[ pr :scr-menu
cond
[ [ = 1 :scr-sub ] [ prosave :scr-menu names ]
[ = 2 :scr-sub ] [ prosave :scr-menu procs ]
[ = 3 :scr-sub ] [ prosave :scr-menu all ] ]
pr "SAVE\ COMPLETE ]
type "? ]
[ = 3 :scr-menu ] [ interrupt ]
[ = 4 :scr-menu ] [ toplevel ]
[ = 5 :scr-menu ] [ end ]
[ = 6 :scr-menu ] [ restart ]
[ = 7 :scr-menu ] [ quit ] ] ]
; *** A LOGO command shell that may be run from within other procedures.
make "interrupt [
procedure [ [ ] [ ] [ :scr-list ] ]
pr "INTERRUPT
while [ not memberp "cont :scr-list ]
[ catch "error [
while [ type "--> make "scr-list rl not memberp "cont :scr-list ]
[ run :scr-list ]
stop ]
poerror ] ]
; *** Output list of all procedures needed to run the named procedure.
make "link [
procedure [ [ :proc-name ] [ ] [ :link-list ] ]
if procedurep :proc-name
[ make "link-list se :proc-name [ ]
linksub bf bf thing :proc-name ]
[ ( pr :proc-name [ is not a procedure ] ) output [ ] ]
output :link-list ]
make "linksub [
procedure [ [ :proc-list ] [ ] [ :lfirst ] ]
if emptyp :proc-list [ stop ] [ ]
make "lfirst first :proc-list
cond
[ [ listp :lfirst ] [ linksub :lfirst ]
[ procedurep :lfirst ]
[ if memberp :lfirst :link-list
[ ]
[ make "link-list fput :lfirst :link-list
linksub bf bf thing :lfirst ] ] ]
linksub bf :proc-list stop ]
; *** convert all upper case letters to lower case.
make "lower [
procedure [ [ :w ] [ ] [ :l :c :o ] ]
if listp :w
[ make "o [ ]
while [ not emptyp :w ]
[ make "o fput lower first :w :o
make "w bf :w ]
output reverse :o ]
[ make "o "
make "c count :w
while [ >0 :c ]
[ make "l item :c :w
if and >= ascii :l 65 <= ascii :l 90
[ make "o fput char + ascii :l 32 :o ]
[ make "o fput :l :o ]
make "c - :c 1 ]
output :o ] ]
; *** Output true if word fits pattern.
make "matchp [
procedure [ [ :p :w ] [ ] [ :i :cp :cw :fpat :rpat ] ]
if listp :p
[ make "i false
while [ not emptyp :p ]
[ make "fpat first :p
if = "~ first :fpat
[ if matchp bf :fpat :w
[ output false ]
[ ] ]
[ make "i or :i matchp :fpat :w ]
make "p bf :p ]
output :i ]
[ ]
if = "~ first :p [ output not matchp bf :p :w ] [ ]
if memberp "* :p
[ if = first :p "*
[ while [ = first :p "* ]
[ make "p bf :p
if emptyp :p
[ output true ]
[ ] ]
if memberp "* :p
[ make "cp 1
while [ not = "* item + 1 :cp :p ] [ make "cp + 1 :cp ]
make "fpat items 1 :cp :p
make "rpat restof :cp :p
make "cw count :w
make "i 0
while [ >= :cw + :i :cp ]
[ if = :fpat items + 1 :i :cp :w
[ output matchp :rpat restof ( + :i :cp ) :w ]
[ ]
make "i + 1 :i ]
output false ]
[ make "cp count :p
make "i count :w
output if >= :i :cp
[ = :p items ( - :i :cp -1 ) :cp :w ]
[ false ] ] ]
[ make "i 1
while [ not = "* item + 1 :i :p ] [ make "i + 1 :i ]
output if = items 1 :i :p items 1 :i :w
[ matchp restof :i :p restof :i :w ]
[ false ] ] ]
[ output = :p :w ] ]
; *** Output list of unburied names that do not contain procedures.
make "names [
procedure [ [ ] [ ] [ :scr-n :scr-x :scr-o ] ]
make "scr-n namelist
dowhile
[ make "scr-x first :scr-n
make "scr-n bf :scr-n
if ( or primitivep :scr-x
procedurep :scr-x
if > 4 count :scr-x
[ false ]
[ = "scr- items 1 4 :scr-x ] )
[ ]
[ make "scr-o fput :scr-x :scr-o ] ]
[ not emptyp :scr-n ]
output :scr-o ]
; *** Output list of all words in the list that fit the pattern.
make "patfilter [
procedure [ [ :p :f ] [ ] [ :o ] ]
make "p lower :p
while [ not emptyp :f ]
[ if matchp :p lower first :f
[ make "o fput first :f :o ]
[ ]
make "f bf :f ]
output reverse :o ]
; *** Output list of unburied names that contain procedures.
make "procs [
procedure [ [ ] [ ] [ :scr-n :scr-x :scr-o ] ]
make "scr-n namelist
dowhile
[ make "scr-x first :scr-n
make "scr-n bf :scr-n
if procedurep :scr-x
[ make "scr-o fput :scr-x :scr-o ]
[ ] ]
[ not emptyp :scr-n ]
output :scr-o ]
; *** Save names, their bindings, and their protection status to file.
make "prosave [
procedure [ [ :scr-fn :scr-n ] [ ] [ :scr-b :scr-fp ] ]
if listp :scr-n
[ make "scr-b justburied :scr-n ]
[ if buriedp :scr-n
[ make "scr-b se :scr-n [ ] ]
[ make "scr-b [ ] ] ]
if emptyp :scr-b
[ save :scr-fn :scr-n ]
[ make "scr-fp open :scr-fn
catch "error
[ fprint :scr-fp [ ]
fprint :scr-fp [ ]
( fshow :scr-fp "unbury :scr-b )
fprint :scr-fp [ ]
fprintout :scr-fp :scr-n
fprint :scr-fp [ ]
( fshow :scr-fp "bury :scr-b )
fprint :scr-fp [ ] ]
close :scr-fp
saveicon :scr-fn ] ]
make "justburied [
procedure [ [ :scr-n ] [ ] [ :scr-x :scr-o ] ]
dowhile
[ make "scr-x first :scr-n
make "scr-n bf :scr-n
if buriedp :scr-x
[ make "scr-o fput :scr-x :scr-o ]
[ ] ]
[ not emptyp :scr-n ]
output :scr-o ]
; *** Closes windows, screens, and files, erases all but utility-stuff.
make "restart [
procedure [ ]
setmenu @0 [ ]
whenclose [ ]
whenmenu [ ]
whenmouse [ ]
whenchar [ ]
if buriedp "utility-stuff
[ erase filter :utility-stuff all
initmenu
end ]
[ erase namelist
erase burylist
recycle
toplevel ] ]
; *** Reverse the order of the items in the object.
make "reverse [
procedure [ [ :from ] [ :into ] ]
if emptyp :into
[ if wordp :from
[ make "into " ] [ ] ] [ ]
if emptyp :from
[ output :into ]
[ output ( reverse bf :from fput first :from :into ) ] ]
; *** Output sorted directory list.
make "sdir [
procedure [ [ ] [ :d :p ] [ :c :t :dn :fn ] ]
if emptyp :d [ make "c dir ] [ make "c ( dir :d ) ]
if emptyp :p [ ] [ make "c patfilter :p :c ]
while [ not emptyp :c ] [
make "t first :c
make "c bf :c
if = "/ last :t
[ make "dn fput :t :dn ]
[ make "fn fput :t :fn ] ]
output
se if > count :dn 1 [ sort "alphap :dn ] [ :dn ]
if > count :fn 1 [ sort "alphap :fn ] [ :fn ] ]
; *** Output sorted directory list.
make "sdira [
procedure [ [ ] [ :d :p ] [ :c :t :dn :fn :w ] ]
if emptyp :d
[ make "c dir make "d " ]
[ make "c ( dir :d )
if or = "/ last :d = ": last :d
[ ]
[ make "d word :d "/ ] ]
if emptyp :p [ ] [ make "c patfilter :p :c ]
while [ not emptyp :c ] [
make "t first :c
make "c bf :c
if = "/ last :t
[ make "dn fput :t :dn ]
[ make "fn fput :t :fn ] ]
make "dn if > count :dn 1 [ sort [ not alphap ] :dn ] [ :dn ]
while [ not emptyp :dn ] [
make "t first :dn
make "dn bf :dn
make "c fput ( sdira word :d :t ) :c
make "c fput :t :c ]
output se :c if > count :fn 1 [ sort "alphap :fn ] [ :fn ] ]
; *** Sort list according to test. Where "test" is the compare operation.
make "sort [
procedure [ [ :comparep :ra ] [ ] [ :n :l :j :ir :i :rra ] ]
make "comparep ( se [ procedure [ [ :a :b ] ] output ]
:comparep
[ :a :b ] )
make "n count :ra
make "ra se :ra [ ]
make "l + 1 int / :n 2
make "ir :n
while [ true ]
[ if > :l 1
[ make "l - :l 1
make "rra item :l :ra ]
[ make "rra item :ir :ra
repitem :ir :ra item 1 :ra
make "ir - :ir 1
if = :ir 1
[ output fput :rra bf :ra ] [ ] ]
make "i :l
make "j * 2 :l
while [ >= :ir :j ]
[ if if < :j :ir
[ comparep item :j :ra item + 1 :j :ra ]
[ false ]
[ make "j + 1 :j ] [ ]
if comparep :rra item :j :ra
[ repitem :i :ra item :j :ra
make "i :j
make "j + :i :j ]
[ make "j + 1 :ir ] ]
repitem :i :ra :rra ] ]
; *** Prepare screen, window, and turtle for simple turtle graphics.
make "turtle [
procedure [ [ ] [ :v :d ] ]
if numberp :d [ ] [ make "d 1 ]
if numberp :v [ ] [ make "v 3 ]
( intuition 6 @0 )
recycle
make "s1 ( openscreen :v :d [ turtle ] )
make "w1 openwindow :s1
make "t1 openturtle :w1
setrgb :s1 0 [ 0 0 0 ]
setrgb :s1 1 [ 14 14 14 ]
( intuition 2 @0 0 0 )
( intuition 8 @0 550 54 )
if < 300 peek -2 psum peek 0 :s1 14
[ ( intuition 1 @0 0 350 ) ]
[ ( intuition 1 @0 0 150 ) ]
( intuition 6 @0 ) ]
; *** Print out contents of lists verticaly.
make "vpr [
procedure [ [ :l ] [ :i ] ]
if emptyp :i [ make "i 0 ] [ ]
if listp :l
[ while [ not emptyp :l ]
[ ( vpr first :l + 1 :i )
make "l bf :l ]
pr [ ] ]
[ repeat :i [ type "\ ]
pr :l ] ]
; *** A list of names defined in this file.
make "utility-stuff [ e pi dr dra sdir sdira edit prosave allnames names
allprocs procs justburied all link linksub ignore
patfilter lower matchp
end reverse filter initmenu domenu do-com-menu interrupt restart
sort vpr com-menu turtle utility-stuff ]
; *** Bury the names defined in this file.
bury :utility-stuff
; *** Initialize the command window menus and menu demon.
initmenu